﻿
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ABC.Domain.Entities;
using ABC.Domain.Json;
using ABC.Core.Extentions;
using RosService.Data;

namespace ABC.Business.Models
{
    public class CabinetModel
    {
        private readonly RosModel rosModel;

        public CabinetModel(RosModel rosModel)
        {
            this.rosModel = rosModel;
        }

        public decimal AddObject(string id, Dictionary<string, object> values)
        {
            var objectId = rosModel.AddEntity(id, "ОбъектСтрахования", values);
            return objectId;
        }

        public void UpdateObject(string objectId, Dictionary<string, object> values)
        {
            foreach (var value in values)
            {
                rosModel.UpdateEntityValue(objectId, value.Key, value.Value);
            }
        }

        public FullObjectOfInsurance GetObject(string objectId)
        {
            var @object = rosModel.GetEntityById("ОбъектСтрахования", objectId, new[]
            {
                "ТипОбъектСтрахования","Страхователь","СсылкаНаСтрахователя","КатегорияТС",
                "Марка","Модель","ГодВыпуска","ДвигателяОбъем","МощностьДвигателя","НачалоЭксплуатации",
                "ДатаВыдачиПтс","Руль","КоличествоМест","МаксимальнаяМасса","Грузоподъемность"
            });
            if (@object != null)
            {
                return new FullObjectOfInsurance
                           {
                               Category = @object["ТипОбъектСтрахования"].ToString(),
                               CarManufacture = @object["Марка"].ToString(),
                               CarModel = @object["Модель"].ToString(),
                               CategoryTs = @object["КатегорияТС"].ToString(),
                               NameInsurant = @object["Страхователь"].ToString(),
                               InsurantId = @object["СсылкаНаСтрахователя"].ToString(),
                               Release = @object["ГодВыпуска"].ToString(),
                               Engine = @object["ДвигателяОбъем"].ToString(),
                               Power = @object["МощностьДвигателя"].ToString(),
                               Operation = DateTime.Parse(@object["НачалоЭксплуатации"].ToString()),
                               Pts = DateTime.Parse(@object["ДатаВыдачиПтс"].ToString()),
                               Controlwheel = @object["Руль"].ToString(),
                               Landing = @object["КоличествоМест"].ToString(),
                               Maxmass = @object["МаксимальнаяМасса"].ToString(),
                               Mass = @object["Грузоподъемность"].ToString(),
                           };
            }
            return new FullObjectOfInsurance();
        }

        public string[] GetServiceProgram()
        {
            return rosModel.GetConstantValue<string>("СервисныеПрограммы").Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
        }

        public List<Icon> GetIconsUrl()
        {

            var helper = new UrlHelper(HttpContext.Current.Request.RequestContext);
            var result = new List<Icon>
                             {
                                 new Icon {MimeType = "audio", Url = helper.VirtualImageUrl("icons/audio_64.png")},
                                 new Icon {MimeType = "video", Url = helper.VirtualImageUrl("icons/video_64.png")},
                                 new Icon {MimeType = "unknown", Url = helper.VirtualImageUrl("icons/unknown_64.png")},
                                 new Icon {MimeType = "text/css", Url = helper.VirtualImageUrl("icons/css_64.png")},
                                 new Icon {MimeType = "text/html", Url = helper.VirtualImageUrl("icons/html_64.png")},
                                 new Icon {MimeType = "text/javascript", Url = helper.VirtualImageUrl("icons/js_64.png")},
                                 new Icon
                                     {
                                         MimeType = "application/vnd.ms-excel",
                                         Url = helper.VirtualImageUrl("icons/office_64.png")
                                     },
                                 new Icon
                                     {
                                         MimeType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
                                         Url = helper.VirtualImageUrl("icons/office_64.png")
                                     },
                                 new Icon
                                     {
                                         MimeType = "application/vnd.ms-powerpoint",
                                         Url = helper.VirtualImageUrl("icons/office_64.png")
                                     },
                                 new Icon
                                     {
                                         MimeType =
                                             "application/vnd.openxmlformats-officedocument.presentationml.presentation",
                                         Url = helper.VirtualImageUrl("icons/office_64.png")
                                     },
                                 new Icon
                                     {MimeType = "application/msword", Url = helper.VirtualImageUrl("icons/office_64.png")},
                                 new Icon
                                     {
                                         MimeType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
                                         Url = helper.VirtualImageUrl("icons/office_64.png")
                                     },
                                 new Icon {MimeType = "application/pdf", Url = helper.VirtualImageUrl("icons/pdf_64.png")},
                                 new Icon
                                     {
                                         MimeType = "application/x-rar-compressed",
                                         Url = helper.VirtualImageUrl("icons/rar_64.png")
                                     },
                                 new Icon
                                     {MimeType = "application/x-tar", Url = helper.VirtualImageUrl("icons/tar_64.png")},
                                 new Icon
                                     {
                                         MimeType = "application/x-shockwave-flash",
                                         Url = helper.VirtualImageUrl("icons/swf_64.png")
                                     },
                                 new Icon {MimeType = "text/plain", Url = helper.VirtualImageUrl("icons/txt_64.png")},
                                 new Icon {MimeType = "text/xml", Url = helper.VirtualImageUrl("icons/xml_64.png")},
                                 new Icon {MimeType = "application/zip", Url = helper.VirtualImageUrl("icons/zip_64.png")},
                                 new Icon {MimeType = "text/x-script.phyton", Url = helper.VirtualImageUrl("icons/py_64.png")},
                                 new Icon {MimeType = "application/x-sh", Url = helper.VirtualImageUrl("icons/sh_64.png")},
                             };
            return result;
        }

        public string GetUrl(string type)
        {
            var icons = GetIconsUrl();
            if (!string.IsNullOrEmpty(type))
            {

                if (type.IndexOf(icons[0].MimeType) >= 0)
                {
                    return icons[0].Url;
                }
                if (type.IndexOf(icons[1].MimeType) >= 0)
                {
                    return icons[1].Url;
                }
                for (var i = 2; i < icons.Count; i++)
                {
                    if (type == icons[i].MimeType)
                    {
                        return icons[i].Url;
                    }
                }
            }
            return icons[2].Url;
        }

        public List<EditTicket> GetEditTickets(string userId, string status, out int pageCount, int numberOfOutputData = 0, int pageNumber = -1)
        {
            var key = rosModel.GetEntityValue<string>(userId, "ИдентификаторОбъекта");
            var userIdRemote = rosModel.GetEntityValueCallCenter<decimal>(key, "id_node");
            var result = new List<EditTicket>();
            if (userIdRemote >= 0)
            {
                var filters = new Dictionary<string, object>();
                filters.Add("СсылкаНаПродавца", userIdRemote);
                if (!string.IsNullOrEmpty(status))
                {
                    filters.Add("СтатусНаправления", status);
                }
                var tickets = rosModel.GetEntitiesFromCallCenter("НаправлениеНаСтрахование", userIdRemote.ToString("f0"),
                                                                 new Dictionary<string, Query.НаправлениеСортировки>
                                                                     {
                                                                         {
                                                                             "ДатаСозданияОбъекта",
                                                                             Query.НаправлениеСортировки.Desc
                                                                         }
                                                                     }, filters,
                                                                 new[]
                                                                     {
                                                                         "GuidCode", "СсылкаНаЗаявку/ПорядковыйНомер",
                                                                         "ДатаВыезда", "ДатаСозданияОбъекта",
                                                                         "СсылкаНаЗаявку/СсылкаНаКлиента",
                                                                         "СсылкаНаКурьера", "Результат",
                                                                         "СсылкаНаЗаявку/ВидСтрахования","СтатусНаправления"
                                                                     }, numberOfOutputData, pageNumber,
                                                                 "НаправлениеНаСтрахование");
                pageCount = numberOfOutputData != 0 ? (int)Math.Ceiling((double)tickets.Count / numberOfOutputData) : 0;
                foreach (var r in tickets.AsEnumerable())
                {
                    var ticket = new EditTicket();

                    ticket.Id = r.Convert<string>("GuidCode");
                    ticket.Name = r.Convert<decimal>("СсылкаНаЗаявку/ПорядковыйНомер").ToString("f0") + " / " +
                                  r.Convert<decimal>("ПорядковыйНомер").ToString("f0");
                    ticket.CheckOut = r.Convert<DateTime>("ДатаВыезда").ToString("dd.MM.yyyy");
                    ticket.DateCreate = r.Convert<DateTime>("ДатаСозданияОбъекта");
                    ticket.ClientId = r.Convert<decimal>("СсылкаНаЗаявку/СсылкаНаКлиента").ToString();
                    ticket.ClientName = r.Convert<string>("СсылкаНаЗаявку/СсылкаНаКлиента.НазваниеОбъекта");
                    ticket.CourierId = r.Convert<string>("СсылкаНаКурьера");
                    ticket.Result = r.Convert<string>("Результат") == "" && Convert.ToDecimal(ticket.CourierId) > 0 ? "Назначен специалист" : r.Convert<string>("Результат");
                    ticket.Status = r.Convert<string>("СтатусНаправления");
                    ticket.Type = "Оформление БСО (" + r.Convert<string>("СсылкаНаЗаявку/ВидСтрахования") + ")";
                    ticket.CourierName = r.Convert<string>("СсылкаНаКурьера.НазваниеОбъекта");
                    result.Add(ticket);
                }
                return result.OrderByDescending(x => x.DateCreate).ToList();
            }
            pageCount = 0;
            return result;
        }

        public void UpdateConfirmTarif(string id, Dictionary<string, object> values)
        {
            foreach (var value in values)
            {
                rosModel.UpdateEntityValue(id, value.Key, value.Value);
            }
        }
    }
}
